package Abstract;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/9 16:12
 */
/**
 * 抽象类：
 * 只给出方法定义而不具体实现的方法被称为抽象方法，抽象方法是没有方法体的，在代码的表达上就是没有“{}”。
 * 包含一个或多个抽象方法的类也必须被声明为抽象类。
 * 抽象类除了包含抽象方法外，还可以包含具体的变量和具体的方法以及构造函数
 * 类即使不包含抽象方法，也可以被声明为抽象类，防止被实例化。
 * 特点：
 * *1.抽象类无法被实例化
 * *2.子类继承抽象类然后实现抽象类所有抽象方法
 * *3.子类继承了抽象类则必须实现抽象类中的所有抽象方法
 * *4.抽象类继承接口可以实现任意个接口的方法或者不实现方法
 * *5.抽象子类可以部分或者不实现抽象父类方法
 * 抽象类的定义：
 * *抽象类的定义 abstract class ***
 * *抽象方法的定义：public abstract void ***（）；ps：抽象方法不能有方法体
 * 抽象内中可以存在：
 * 1.什么都不写；
 * 2.通过public、protected、默认(什么都不写)的任意个方法；
 * 3.默认变量、static变量、static final变量(需初始化)
 * 注意：
 * abstract关键字不能和final、private、static一起使用，会产生编译错误
 */
public class Abstract {//测试类

    public static void main(String[] args) {
        Son s = new Son();
        s.age();
        s.name();
    }
}

abstract class Father {//抽象类，有abstract修饰
    public Father(){
        System.out.println("抽象父类的构造方法");
    }
    public abstract void age();//抽象方法，有abstract修饰

    abstract void name();//抽象方法，有abstract修饰

     void family() {//抽象类里可以有非抽象方法

    }
}

//子类必须实现父类的所有抽象方法
class Son extends Father {
    public Son() {//子类构造函数
        //隐式有super();所以会执行父类构造函数
    }
    @Override
    public void age() {//子类实现父类的方法age()
        System.out.println("20");
    }

    @Override
    public void name() {//子类实现父类的方法name()
        System.out.println("陈");
    }
}

//特别点：抽象子类继承抽象父类的抽象方法不用实现抽象方法
abstract class A {
    abstract void eat();//父类抽象方法
}

abstract class B extends A {
    @Override
    abstract void eat();//抽象子类继承父类抽象方法不用实现
}
interface C{
    void run();
    void jump();
}
abstract class D implements C{//抽象类继承接口，
    @Override
    public void run(){
        System.out.println("跑");
    }
}
abstract class E{
    abstract void name();
    abstract void age();
}
abstract class F extends E{
    @Override
    void name(){
        System.out.println("抽象子类实现父类部分方法");
    }
    @Override
    abstract void age();
}